第24天實作要做出向下捲動頁面時,遇到導覽列時,其導覽列會固定在網頁上方,導覽列也會有所變化。當網頁向下滾動時,導覽列也會固定在上方,但當網頁向上捲動回到特定位置,導覽列會回到原本位置。
在網頁中上至下的結構為圖片,導覽列,內容。首先要取得導覽列nav
導覽列離網頁最上方的距離,
const topNav = nav.offsetTop
接下來取得網頁向下捲動的距離window.scrollY
,加入判斷當向下捲動的距離>=
導覽列nav
的距離時,將body
加入CSS的Class,其Class的目的是將導覽列nav
給固定住。為何要加在body
中,因為只要加入body
中,之後加入變化的效果時,只需要改變的CSS內容即可。
.nav-fix{
position: fixed;
}
但此時會生一個小問題,就是當nav
固定在網頁上方時會產生一個跳動的動畫,才造成元素的貼合,因此為了避免這個問題的發生,在body
的元素中加入上邊內距paddingTop
等同nav
的高度。
document.body.style.paddingTop = nav.offsetHeight + 'px'
再當解除固定nav
時,再將其上邊內距paddingTop
回復成原本的樣式。
document.body.style.paddingTop = 0
再當nav
固定在網頁上時,讓nav
其中的一個元素呈現出來。一開始nav
中類別為.logo
的元素的寬度為0,因此當nav
固定在網頁上時,將.logo
的寬度設為300px。
.fixedNav li.logo{
max-width: 300px;
}
這樣當nav
固定時,.logo
的寬度即可從0px
成長至300px
。
接下來是網頁的內容也要隨著nav
的固定,內容的呈現效果將其放大。
.fixedNav .site-wrap{
transform: scale(1);
}
一開始網頁內容的縮放為transform: scale(0.98);
,在nav
固定在網頁時,將其放大為transform: scale(1)
。
這樣就可以做到本實作的目標。
<h1>A story about getting lost.</h1>
</header>
<nav id="main">
<ul>
<li class="logo"><a href="#">LOST.</a></li>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Images</a></li>
<li><a href="#">Locations</a></li>
<li><a href="#">Maps</a></li>
</ul>
</nav>
<div class="site-wrap">
內容
</div>
scroll
滾動事件在元素上。position
,